package com.zto.sch.advance.caffeine;

import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.LoadingCache;
import com.github.benmanes.caffeine.cache.stats.CacheStats;

import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * @program: sch-diy-parent
 * @description:同步加载
 * @author: sch
 * @create: 2020-12-25 18:33
 **/
public class CaffeineDemoLoadingCache {
    public static void main(String[] args) throws InterruptedException {
        LoadingCache<String, String> cache = Caffeine.newBuilder()
                // 基于时间失效,写入之后开始计时失效
                .expireAfterWrite(2000, TimeUnit.MILLISECONDS)
                // 缓存容量
                .maximumSize(5)
                .recordStats()
                // 可以使用java8函数式接口的方式,这里其实是重写CacheLoader类的load方法
                .build((key) -> {
                    long currentTimeMillis = System.currentTimeMillis();

                    return "zto_" + currentTimeMillis;
                });

        // 获取一个不存在的kay,让它去调用CacheLoader的load方法
        //最终调com.github.benmanes.caffeine.cache.BoundedLocalCache.doComputeIfAbsent。生成value放入map中，并返回value
        System.out.println(cache.get("key"));

        // 等待2秒让key失效
        TimeUnit.SECONDS.sleep(2);
        //com.github.benmanes.caffeine.cache.BoundedLocalCache.getIfPresent
        System.out.println(cache.getIfPresent("key"));

        // 批量获取key,让他批量去加载。最终会遍历，逐个调用get()方法
        Map<String, String> all = cache.getAll(Arrays.asList("key1", "key2", "key3"));
        System.out.println(all);

        CacheStats stats = cache.stats();
        double v = stats.hitRate();
        System.out.println("命中率:" + v);
    }
}
